package com.bz.match;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author zhongyongbin
 * @since 2021/5/17
 */
@Component
public class MatchManager {

    @Autowired
    private MatchStrategy matchStrategy;

    @Autowired
    private MatchBizHandler matchBizHandler;

    /**
     * 匹配
     *
     * @param gameId      游戏标识
     * @param playerCount 玩家数量
     */
    public void match(int gameId, int playerCount) {
        MatchResult matchResult = matchStrategy.match(gameId, playerCount);
        if (matchResult.isReady()) {
            matchBizHandler.handle(matchResult.getRoom());
        }
    }

    /**
     * 进入游戏等待房间
     *
     * @param gameId 游戏标识
     * @param userId 用户 ID
     * @return true 为成功进入游戏等待房间； false 为已经在该游戏等待房间中，进入失败。
     */
    public boolean joinWaitRoom(int gameId, long userId) {
        return matchStrategy.joinWaitRoom(gameId, userId);
    }

    /**
     * 离开等待房间
     *
     * @param gameId 游戏 ID
     * @param userId 用户 ID
     * @return true 为成功离开； false 为没有在游戏等待房间中，离开失败
     */
    public boolean leaveWaitRoom(int gameId, long userId) {
        return matchStrategy.leaveWaitRoom(gameId, userId);
    }

    /**
     * 获取匹配策略
     *
     * @return 匹配策略
     */
    public <T extends MatchStrategy> T getMatchStrategy(Class<T> matchStrategyType) {
        return matchStrategyType.cast(this.matchStrategy);
    }
}
